Hyunjung Im
Frontend Developer
2022-04-26
트리는 비선형이며 트리의 각 노드가 노드(자식)에 대한 참조 목록인 값을 저장하도록 노드 컬렉션으로 구성된 계층적 비선형 데이터 구조 입니다.
배열, linked list, stack, queue 와 같은 다른 데이터 구조는 데이터를 순차적으로 저장하는 선형 데이터 구조입니다. 선형 데이터 구조에서 어떤 연산을 수행하기 위해서는 데이터 크기가 커질수록 시간 복잡도가 증가하게됩니다.
트리 데이터 구조는 비선형 데이터 구조이므로 데이터에 더 빠르고 쉽게 액세스할 수 있습니다.
트리를 순회한다는 것은 트리의 모든 노드를 방문하는 것을 의미합니다. 예를 들어 트리의 모든 값을 추가하거나 가장 큰 값을 찾을 수 있습니다. 이러한 모든 작업을 수행하려면 트리의 각 노드를 방문해야 합니다.
배열, 스택, 큐 및 연결 리스트와 같은 선형 데이터 구조는 데이터를 읽는 방법이 한 가지뿐입니다. 그러나 트리와 같은 계층적 데이터 구조는 다른 방식으로 탐색할 수 있습니다.
Inorder 중위 순회 (Left, Root, Right)
Preorder 선주문 순회 (Root, Left, Right)
Postorder 후위 순회(Left, Right, Root)
정렬된 배열이 있다면 이진 검색을 수행할 수 있습니다. 배열에서 숫자를 검색하려고 한다고 가정해보겠습니다. 이진 검색에서는 먼저 전체 목록을 검색 공간으로 정의합니다. 이제 검색할 숫자 또는 검색할 요소를 검색 공간의 중간 요소(중앙값)와 비교하고 검색되는 레코드가 중간 요소보다 작으면 왼쪽 절반으로 검색하고 그렇지 않으면 오른쪽 절반에서 검색합니다. 이진 검색에서 ‘n’으로 시작하고 중간요소가 우리가 찾고 있는 요소가 아닐 경우 검색 공간을 n/2 로 줄입니다. 검색을 완료할 때 까지 검색 공간을 계속 줄여나갑니다.
트리가 균형을 이루고 있으면(균형 노드) 검색 공간 ‘n’으로 시작합니다. 노드를 제거하고 하위 트리 중 하나를 버릴 때 ‘n/2’노드를 버리므로 검색 공간이 ‘n/2’로 줄어듭니다. 다음 단계에서 검색 공간을 ‘n/4’로 줄이고 요소를 찾거나 검색 공간이 하나의 노드로 줄어들 때까지 반복합니다.
<script>
// A utility function to search
// a given key in BST
function search(root, key)
{
// Base Cases: root is null
// or key is present at root
if (root == null ||
root.key == key)
return root;
// Key is greater than root's key
if (root.key < key)
return search(root.right, key);
// Key is smaller than root's key
return search(root.left, key);
}
// This code is contributed by rrrtnx.
</script>
올바른 위치에 값을 삽입하는 것은 왼쪽 하위 트리가 루트보다 작고 오른쪽 하위 트리가 루트보다 크다는 규칙을 유지하려고 하기 때문에 검색과 유사합니다.
값에 따라 오른쪽 하위 트리 또는 왼쪽 하위 트리로 계속 이동하고 왼쪽 또는 오른쪽 하위 트리가 null인 지점에 도달하면 거기에 새 노드를 넣습니다.
<script>
// javascript program to demonstrate
// insert operation in binary
// search tree
/*
* Class containing left and right child of current node and key value
*/
class Node {
constructor(item) {
this.key = item;
this.left = this.right = null;
}
}
// Root of BST
var root = null;
// This method mainly calls insertRec()
function insert(key) {
root = insertRec(root, key);
}
/*
* A recursive function to insert a new key in BST
*/
function insertRec(root , key) {
/*
* If the tree is empty, return a new node
*/
if (root == null) {
root = new Node(key);
return root;
}
/* Otherwise, recur down the tree */
if (key < root.key)
root.left = insertRec(root.left, key);
else if (key > root.key)
root.right = insertRec(root.right, key);
/* return the (unchanged) node pointer */
return root;
}
// This method mainly calls InorderRec()
function inorder() {
inorderRec(root);
}
// A utility function to
// do inorder traversal of BST
function inorderRec(root)
{
if (root != null) {
inorderRec(root.left);
document.write(root.key+"<br/>");
inorderRec(root.right);
}
}
// Driver Code
/* Let us create following BST
50
/ 30 70
/ / 20 40 60 80 */
insert(50);
insert(30);
insert(20);
insert(40);
insert(70);
insert(60);
insert(80);
// print inorder traversal of the BST
inorder();
// This code is contributed by Rajput-Ji
</script>
이진 검색 트리에서 노드를 삭제하는 세 가지 경우가 있습니다.
<script>
// Javascript program to demonstrate
// delete operation in binary
// search tree
class Node
{
constructor(item)
{
this.key = item;
this.left = this.right = null;
}
}
// Root of BST
let root=null;
// This method mainly calls deleteRec()
function deleteKey(key)
{
root = deleteRec(root, key);
}
/* A recursive function to
delete an existing key in BST
*/
function deleteRec(root,key)
{
/* Base Case: If the tree is empty */
if (root == null)
return root;
/* Otherwise, recur down the tree */
if (key < root.key)
root.left = deleteRec(root.left, key);
else if (key > root.key)
root.right = deleteRec(root.right, key);
// if key is same as root's
// key, then This is the
// node to be deleted
else {
// node with only one child or no child
if (root.left == null)
return root.right;
else if (root.right == null)
return root.left;
// node with two children: Get the inorder
// successor (smallest in the right subtree)
root.key = minValue(root.right);
// Delete the inorder successor
root.right = deleteRec(root.right, root.key);
}
return root;
}
function minValue(root)
{
let minv = root.key;
while (root.left != null)
{
minv = root.left.key;
root = root.left;
}
return minv;
}
// This method mainly calls insertRec()
function insert(key)
{
root = insertRec(root, key);
}
/* A recursive function to
insert a new key in BST */
function insertRec(root,key)
{
/* If the tree is empty,
return a new node */
if (root == null) {
root = new Node(key);
return root;
}
/* Otherwise, recur down the tree */
if (key < root.key)
root.left = insertRec(root.left, key);
else if (key > root.key)
root.right = insertRec(root.right, key);
/* return the (unchanged) node pointer */
return root;
}
// This method mainly calls InorderRec()
function inorder()
{
inorderRec(root);
}
// A utility function to do inorder traversal of BST
function inorderRec(root)
{
if (root != null) {
inorderRec(root.left);
document.write(root.key + " ");
inorderRec(root.right);
}
}
// Driver Code
/* Let us create following BST
50
/ 30 70
/ / 20 40 60 80 */
insert(50);
insert(30);
insert(20);
insert(40);
insert(70);
insert(60);
insert(80);
document.write(
"Inorder traversal of the given tree<br>");
inorder();
document.write("<br>Delete 20<br>");
deleteKey(20);
document.write(
"Inorder traversal of the modified tree<br>");
inorder();
document.write("<br>Delete 30<br>");
deleteKey(30);
document.write(
"Inorder traversal of the modified tree<br>");
inorder();
document.write("<br>Delete 50<br>");
deleteKey(50);
document.write(
"Inorder traversal of the modified tree<br>");
inorder();
// This code is contributed by avanitrachhadiya2155
</script>
참조 및 출처